package algo3.g203.modelo.tablero;

import java.util.*;

import algo3.g203.modelo.armas.Arma;
import algo3.g203.modelo.armas.EspacioNaves;
import algo3.g203.modelo.armas.ObservadorDeArma;
import algo3.g203.modelo.fisica.Posicion;
import algo3.g203.modelo.naves.Nave;
import algo3.g203.modelo.naves.ObservadorDeNave;

public class Tablero implements ObservadorDeArma, ObservadorDeNave, EspacioNaves{
	
	private List<Arma> listaArmas;
	private List<Nave> listaNaves;
	private List<ObservadorDeTablero> listaObservadores;
	
	public Tablero() {
		this.listaNaves = new ArrayList<Nave>();
		this.listaArmas = new ArrayList<Arma>();
		this.listaObservadores = new Vector<ObservadorDeTablero>();
	}

	public void colocarNave(Nave nuevaNave) {
		nuevaNave.agregarObservador(this);
		this.listaNaves.add(nuevaNave);
	}
	
	public void colocarArma(Arma nuevaArma) {
		nuevaArma.agregarObservador(this);
		this.listaArmas.add(nuevaArma);
	}
	
	public void comenzarTurno() {
		// NO USAR ITERADOR - ESTAS LISTAS VARIAN DE TAMANIO MIENTRAS SE LAS RECORRE!!!
		for ( int i = 0 ; i < this.listaArmas.size(); i++ )
			if(this.listaArmas.get(i).comenzarTurno())
				i--;
		
		for ( int i = 0 ; i < this.listaNaves.size(); i++ )
			if(this.listaNaves.get(i).comenzarTurno())
				i--;
	}
	
	/*
	 * 
	 *   CONSULTA -----...........
	 * 
	 */
	
	@Override
	public boolean existeSeccionDeNaveNoDestruidaEn(Posicion p) {
		for (Nave n : this.listaNaves)
			if (n.tieneSeccionNoDaniadaEn(p))
				return true;
		return false;
	}
	
	/**
	 * Dice si queda alguna nave en el tablero
	 * 
	 * @return : true si la cantidad de naves en el tablero es cero.
	 */
	public boolean quedanNaves() {
		return (!this.listaNaves.isEmpty());
	}
	
	public void agregarObservador(ObservadorDeTablero o) {
		this.listaObservadores.add(o);		
	}

	@Override
	public void notificarArmaDebeEstallar(Arma a) {

		for (Nave nave : this.listaNaves)
			nave.recibirDisparo(a);
				
		for (ObservadorDeTablero o : this.listaObservadores)
			o.notificarArmaEliminada(a);
		
		this.listaArmas.remove(a);

	}

	@Override
	public void notificarNaveEliminada(Nave n) {
		
		for (ObservadorDeTablero o : this.listaObservadores)
			o.notificarNaveEliminada(n);
		
		this.listaNaves.remove(n);

	}


}